<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // Promise的优点:
    // 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数。此外，Promise对象提供统一的接口，使得控制异步操作更加容易。

    // Promise对象(实例化对象)的方法
    // then(resolveHandler,rejectHandler)     Promise 对象添加状态改变时的回调函数
    // resolveHandler()    将Promise对象的状态 由 pending(进行中) 变为 fulfilled(已成功)执行此回调函数
    // rejectHandler()    将Promise对象的状态 由 pending(进行中) 变为 rejected(已失败)执行此回调函数

    // 返回值:  新的Promise对象  -> 链式操作

    // 注意:
    // then() 调用发生在异步代码执行之前 => 可以理解为then()提前指定了状态改变时要执行的内容(回调函数), 等Promise状态改变后 -> 执行对应的回调函数
    // resolveHandler()  rejectHandler() 都有一个形式参数 -> 用于接收Promise对象中存储的数据


    // 什么时候Promise对象的状态会变为已失败
    // 1. 当reject() 被调用时  => Promise对象的状态会变为已失败状态
    // 2. new Promise()中的回调函数,在执行过程中有try...catch 异常捕获机制 -> 如果回调函数执行时出错 => Promise对象会变为已失败 => 错误的信息(err对象)会作为Promise对象的数据存储


    // catch(rejectHandler)    用于指定发生错误时的回调函数。  (catch方法就是基于then方法封装的,只指定了错误发生时的回调函数)

    // 可以理解为
    // Promise.prototype.catch = function (rejectHandler) {
    //     // this -> 调用此方法的实例化对象(Promise对象)
    //     return this.then(null, rejectHandler);
    // }


    // finally()     无论Promise对象的状态是已成功,还是已失败  -> 都会执行的回调函数

    // 可以理解为
    // Promise.prototype.finally = function (finallyCallback) {
    //     // this -> 调用此方法的实例化对象(Promise对象)
    //     return this.then(function () {
    //         finallyCallback();
    //     }, function () {
    //         finallyCallback();
    //     });
    // }





    var p = new Promise(function (resolve, reject) {
        // Promise接收一个回调函数 -> 容器 -> 一般用来执行一段代码(通常是异步操作 ,同步也可以)
        // 注意: Promise接收一个回调函数 => 同步任务 => new Promise() 调用时立即执行

        console.log("回调函数开始执行");
        // aaa;  // 报错:  aaa is not defined  => 被捕获 => Promise对象就会变为已失败(err信息会作为数据存储)

        setTimeout(function () {
            reject(2222);
        }, 2000)

    });

    console.log(p); // {<rejected>:err}

    // 某些情况下 -> 想单独指定代码执行失败时的错误处理函数  -> then(null,rejectHandler)
    // p.then(null, function (err) {
    //     console.log("rejected", err);
    // })

    // 可以理解为
    // Promise.prototype.catch = function (rejectHandler) {
    //     // this -> 调用此方法的实例化对象(Promise对象)
    //     return this.then(null, rejectHandler);
    // }

    // p.catch(function (err) {
    //     console.log("rejected", err);
    // })


    p.finally(function () { // finally中没有形参接收结果
        console.log("异步操作执行完毕");
    })

</script>

</html>